import { Event, IDisposable, OperatingSystem, URI } from '../../utils';

import type vscode from 'vscode';
import { IShellLaunchConfig, TerminalIcon } from './pty';
import {
  ICreateContributedTerminalProfileOptions,
  ITerminalEnvironment,
  ITerminalProfileProvider,
} from './extension';

// 解析默认 profile 的参数
export interface IResolveDefaultProfileOptions {
  os?: OperatingSystem; // 可选，指定操作系统
}

// 终端 profile 服务接口
export interface ITerminalProfileService {
  readonly availableProfiles: ITerminalProfile[]; // 当前可用的 profile 列表
  readonly contributedProfiles: IExtensionTerminalProfile[]; // 扩展贡献的 profile 列表
  readonly profilesReady: Promise<void>; // profile 列表准备完成的 Promise
  onTerminalProfileResolved: Event<string>; // profile 解析完成事件
  onDidChangeAvailableProfiles: Event<ITerminalProfile[]>; // 可用 profile 变更事件
  onDidChangeDefaultShell: Event<string>; // 默认 shell 变更事件
  getContributedProfileProvider(
    extensionIdentifier: string,
    id: string
  ): ITerminalProfileProvider | undefined; // 获取扩展 profile provider
  registerTerminalProfileProvider(
    extensionIdentifier: string,
    id: string,
    profileProvider: ITerminalProfileProvider
  ): IDisposable; // 注册扩展 profile provider
  createContributedTerminalProfile(
    extensionIdentifier: string,
    id: string,
    options: ICreateContributedTerminalProfileOptions
  ): Promise<void>; // 创建扩展 profile
  addContributedProfile(
    extensionId: string,
    contributions: ITerminalContributions
  ): void; // 添加扩展 profile
  removeContributedProfile(extensionId: string): void; // 移除扩展 profile
}

// 终端 profile 接口
export interface ITerminalProfile {
  profileName: string; // profile 名称
  path: string; // shell 路径
  isDefault: boolean; // 是否为默认 profile
  isAutoDetected?: boolean; // 是否自动检测
  args?: string | string[] | undefined; // 启动参数
  env?: ITerminalEnvironment; // 环境变量
  overrideName?: boolean; // 是否覆盖名称
  color?: string; // 颜色
  icon?: TerminalIcon; // 图标
}

// 未解析的 profile 基础接口
export interface IBaseUnresolvedTerminalProfile {
  args?: string | string[] | undefined; // 启动参数
  isAutoDetected?: boolean; // 是否自动检测
  overrideName?: boolean; // 是否覆盖名称
  icon?: string | TerminalIcon; // 图标
  color?: string; // 颜色
  env?: ITerminalEnvironment; // 环境变量
}

// 可执行 profile 接口
export interface ITerminalExecutable extends IBaseUnresolvedTerminalProfile {
  path: string | string[]; // shell 路径
}

// profile 来源枚举
export const enum ProfileSource {
  GitBash = 'Git Bash',
  Pwsh = 'PowerShell',
}

// 来源 profile 接口
export interface ITerminalProfileSource extends IBaseUnresolvedTerminalProfile {
  source: ProfileSource; // 来源类型
}

// 潜在 profile 接口
export interface IPotentialTerminalProfile {
  profileName: string; // profile 名称
  paths: string[]; // shell 路径数组
  args?: string[]; // 启动参数
  icon?: vscode.ThemeIcon | URI | { light: URI; dark: URI }; // 图标
}

// 未解析的 profile 类型
export type IUnresolvedTerminalProfile =
  | ITerminalExecutable
  | ITerminalProfileSource
  | null;

// 比较两个 profile 的 args 是否一致
export function terminalProfileArgsMatch(
  args1: string | string[] | undefined,
  args2: string | string[] | undefined
): boolean {
  if (!args1 && !args2) {
    return true;
  } else if (typeof args1 === 'string' && typeof args2 === 'string') {
    return args1 === args2;
  } else if (Array.isArray(args1) && Array.isArray(args2)) {
    if (args1.length !== args2.length) {
      return false;
    }
    for (let i = 0; i < args1.length; i++) {
      if (args1[i] !== args2[i]) {
        return false;
      }
    }
    return true;
  }
  return false;
}

// profile 检测偏好配置
export interface IDetectProfileOptionsPreference {
  [key: string]: IUnresolvedTerminalProfile;
}

export interface ITerminalProfileInternalService {
  resolveDefaultProfile(
    options?: IResolveDefaultProfileOptions
  ): Promise<ITerminalProfile | undefined>; // 解析默认 profile
  resolveRealDefaultProfile(): Promise<ITerminalProfile | undefined>; // 解析真实默认 profile
}

// profile 检测参数
export interface IDetectProfileOptions {
  autoDetect: boolean; // 是否自动检测可用 profile
  preference?: IDetectProfileOptionsPreference; // 偏好配置
}

// 终端扩展贡献接口
export interface ITerminalContributions {
  profiles?: ITerminalProfileContribution[]; // 扩展贡献的 profile 列表
}

// 终端 profile 贡献项接口
export interface ITerminalProfileContribution {
  title: string; // profile 标题
  id: string; // profile id
  icon?: URI | { light: URI; dark: URI } | string; // 图标
  color?: string; // 颜色
}

// 扩展终端 profile 接口
export interface IExtensionTerminalProfile
  extends ITerminalProfileContribution {
  extensionIdentifier: string; // 扩展标识
}

// 终端 profile 对象类型
export type ITerminalProfileObject =
  | ITerminalExecutable
  | ITerminalProfileSource
  | IExtensionTerminalProfile
  | null;
// 终端 profile 类型
export type ITerminalProfileType = ITerminalProfile | IExtensionTerminalProfile;

// 保存扩展 profile 的参数
export interface ISaveContributedProfileArgs {
  extensionIdentifier: string; // 扩展标识
  id: string; // profile id
  title: string; // profile 标题
  options: ICreateContributedTerminalProfileOptions; // profile 选项
}
